﻿using System;
using System.Collections.Generic;
using System.Web;
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;
using System.IO;

namespace GL.Tools
{
    /// <summary>
    /// 图片处理工具类
    /// </summary>
    public class ImageUtil
    {
        /// <summary>
        /// 等比例生成缩略图
        /// </summary>
        /// <param name="imgPath">需要压缩的图片路劲</param>
        /// <param name="outPath">输出的图片路劲</param>
        /// <param name="width">压缩后的最大宽度</param>
        /// <param name="height">压缩后的最大高度</param>
        /// <returns>处理结果</returns>
        public static bool Compress(string inPath, string outPath, int width, int height)
        {
            return Compress(inPath, outPath, width, height, false);
        }
        /// <summary>
        /// 等比例生成缩略图
        /// </summary>
        /// <param name="imgPath">需要压缩的图片路劲</param>
        /// <param name="outPath">输出的图片路劲</param>
        /// <param name="width">压缩后的最大宽度</param>
        /// <param name="height">压缩后的最大高度</param>
        /// <param name="isZoom">宽和高都没有超过width和height值是否需要放大</param>
        /// <returns>处理结果</returns>
        public static bool Compress(string inPath, string outPath, int width, int height, bool isZoom)
        {
            Image inImage = null;
            try
            {
                inImage = Image.FromFile(inPath);
                if (inImage == null)
                {
                    return false;
                }
            }
            catch
            {
                return false;
            }


            int iw = inImage.Width;//获取原始图片的宽
            int ih = inImage.Height;//获取原始图片的高

            if (!isZoom)
            {
                //如果用户没有设置强制放大功能
                //则判断图片的原始尺寸有没有超过用户设置的最大尺寸
                //如果没有超过用户设置的最大尺寸 则直接复制原图到用户设置的路劲下
                if (iw < width && ih < height)
                {
                    //复制文件病覆盖已存在的文件
                    File.Copy(inPath, outPath, true);
                    return true;
                }
            }

            int x = 0; //缩略图在画布上的X放向起始点
            int y = 0; //缩略图在画布上的Y放向起始点

            int ow = 0;//输出的图片宽度
            int oh = 0;//输出的图片高度

            if (width * inImage.Height < height * inImage.Width)
            {
                ow = width;
                oh = (int)Math.Round((decimal)ih * width / iw);

                // 缩放成宽度跟预定义的宽度相同的，即left=0，计算top   
                x = 0;
                y = (int)Math.Round((decimal)(height - oh) / 2);
            }
            else
            {
                ow = (int)Math.Round((decimal)iw * height / ih);
                oh = height;

                // 缩放成高度跟预定义的高度相同的，即top=0，计算left   
                x = (int)Math.Round((decimal)(width - ow) / 2);
                y = 0;
            }

            x = 0;
            y = 0;

            //新建一个bmp图片
            System.Drawing.Image bitmap = new System.Drawing.Bitmap(ow, oh);

            //新建一个画板
            Graphics g = System.Drawing.Graphics.FromImage(bitmap);

            //设置高质量插值法
            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;

            //设置高质量,低速度呈现平滑程度
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;

            //清空画布并以白色背景色填充
            //g.Clear(Color.White);

            //在指定位置并且按指定大小绘制原图片的指定部分
            g.DrawImage(inImage, new Rectangle(x, y, ow, oh), new Rectangle(0, 0, iw, ih), GraphicsUnit.Pixel);

            try
            {
                //以Jpeg格式保存缩略图(KB最小)
                bitmap.Save(outPath, System.Drawing.Imaging.ImageFormat.Jpeg);
            }
            catch (System.Exception e)
            {
                throw e;
            }
            finally
            {
                inImage.Dispose();
                bitmap.Dispose();
                g.Dispose();
            }
            return true;
        }

        /// <summary>
        /// 根据尺寸，裁剪图片
        /// </summary>
        /// <param name="inPath">需要裁剪的图片路径</param>
        /// <param name="outPath">输出的图片路劲</param>
        /// <param name="width">裁剪的宽度</param>
        /// <param name="height">裁剪的高度</param>
        /// <returns>返回结果</returns>
        public static bool Cut(string inPath, string outPath, int width, int height)
        {
            return Cut(inPath, outPath, width, height, false);
        }


        /// <summary>
        /// 根据尺寸，裁剪图片
        /// </summary>
        /// <param name="inPath">需要裁剪的图片路径</param>
        /// <param name="outPath">输出的图片路劲</param>
        /// <param name="width">裁剪的宽度</param>
        /// <param name="height">裁剪的高度</param>
        /// <param name="isZoom">原始的宽度或者高度其一小于对应的要裁剪的宽高是是否需要按比例缩小</param>
        /// <returns>返回结果</returns>
        public static bool Cut(string inPath, string outPath, int width, int height, bool isZoom)
        {
            Image inImage = null;
            try
            {
                inImage = Image.FromFile(inPath);
                if (inImage == null)
                {
                    return false;
                }
            }
            catch
            {
                return false;
            }

            // 原始图片的宽度及高度 
            int iw = inImage.Width;
            int ih = inImage.Height;

            if (!isZoom)
            {
                //如果原始尺寸的宽或者高没有达到预想的值
                if (iw < width || ih < height)
                {
                    decimal ib = (decimal)iw / ih;//远处的宽高比
                    decimal ob = (decimal)width / height;//输出的宽高比

                    if (ib > ob)
                    {
                        //原始的宽度比输出的宽度长了
                        //此时已原始的高度为标准
                        height = ih;
                        width = (int)(height * ob);
                    }
                    else
                    {
                        //原始的高度比输出的高度高了
                        //此时已原始的宽度为标准
                        width = iw;
                        height = (int)((decimal)width / ob);
                    }
                }
            }

            // 需要生成的缩略图在上述"画布"上的起点位置 
            int X = 0;
            int Y = 0;

            // 根据原始图片及欲生成的缩略图尺寸,计算缩略图的实际尺寸及原始图片需要裁剪后的左边或上面坐标 
            if (height * iw > width * ih)
            {
                X = (iw - width * ih / height) / 2;
            }
            else
            {
                Y = (ih - height * iw / width) / 2;
            }
            //图片经过缩放剪裁后的宽和高
            int W = 0;
            int H = 0;
            W = X > 0 ? iw - X * 2 : iw;
            H = Y > 0 ? ih - Y * 2 : ih;

            // 创建画布 
            Bitmap bmp = new Bitmap(width, height);
            Graphics g = Graphics.FromImage(bmp);

            // 用白色清空 
            //g.Clear(Color.White);

            // 指定高质量的双三次插值法。执行预筛选以确保高质量的收缩。此模式可产生质量最高的转换图像。
            g.InterpolationMode = InterpolationMode.HighQualityBicubic;
            // 指定高质量、低速度呈现。 
            g.SmoothingMode = SmoothingMode.HighQuality;
            // 在指定位置并且按指定大小绘制指定的 Image 的指定部分。 
            g.DrawImage(inImage, new Rectangle(0, 0, width, height), new Rectangle(X, Y, W, H), GraphicsUnit.Pixel);
            try
            {
                //经测试 .jpg 格式缩略图大小与质量等最优 
                bmp.Save(outPath, ImageFormat.Jpeg);
            }
            catch
            {
                return false;
            }
            finally
            {
                //显示释放资源 
                inImage.Dispose();
                bmp.Dispose();
                g.Dispose();
            }
            return true;
        }

        public static bool JcropImg(String inPath, String outPath, int x, int y, int w, int h, int width, int height)
        {

            Image inImage = null;
            try
            {
                inImage = Image.FromFile(inPath);
                if (inImage == null)
                {
                    return false;
                }
            }
            catch
            {
                return false;
            }

            //没有设置宽高时设为选中的尺寸
            width = width == 0 ? w : width;
            height = height == 0 ? h : height;

            //新建一个bmp图片
            System.Drawing.Image bitmap = new System.Drawing.Bitmap(width, height);

            //新建一个画板
            Graphics g = System.Drawing.Graphics.FromImage(bitmap);

            //设置高质量插值法
            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;

            //设置高质量,低速度呈现平滑程度
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;

            //清空画布并以白色背景色填充
            //g.Clear(Color.White);

            //在指定位置并且按指定大小绘制原图片的指定部分
            g.DrawImage(inImage, new Rectangle(0, 0, width, height), new Rectangle(x, y, w, h), GraphicsUnit.Pixel);

            try
            {
                //以Jpeg格式保存缩略图(KB最小)
                bitmap.Save(outPath, System.Drawing.Imaging.ImageFormat.Jpeg);
            }
            catch (System.Exception e)
            {
                throw e;
            }
            finally
            {
                inImage.Dispose();
                bitmap.Dispose();
                g.Dispose();
            }
            return true;
        }
    }
}
